package com.qf.controller;

import com.qf.pojo.Goods;
import com.qf.service.GoodsService;
import com.qf.service.impl.GoodsServiceImpl;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * 商品管理
 */
@WebServlet("/goods")
public class GoodsController extends  BaseServlet {

    /**
     * 跳转到首页
     */
    public String index(HttpServletRequest request , HttpServletResponse response){
        //1、调用业务层查询所有商品数据
        GoodsService goodsService = new GoodsServiceImpl();
        List<Goods> list = goodsService.findGoodsAll();

        //2、将商品存入request域对象中
        request.setAttribute("goodsList", list);
        return "forward:/index.jsp";
    }

    /**
     * 跳转到商品详情页面
     */
    public String detail( HttpServletRequest request , HttpServletResponse response ){
        //1、接收传入的参数，商品id
        String id = request.getParameter("id");
        //2、根据商品id查询商品详细信息
        GoodsService goodsService = new GoodsServiceImpl();
        Goods goods = goodsService.findGoodsById(Integer.parseInt(id));
        //3、将查询到的商品数据放入request请求域对象中，带到页面中展示使用
        request.setAttribute("goods", goods);
        //4、请求转发到商品的详情页面
        return "forward:/goodsDetail.jsp";
    }

    /**
     * 查询商品列表展示
     */
    public String show(HttpServletRequest request, HttpServletResponse response) {
        //1、调用业务层，查询所有商品数据
        GoodsService goodsService = new GoodsServiceImpl();
        List<Goods> list = goodsService.findGoodsAll();
        //2、将商品数据存入到request域对象中
        request.setAttribute("goodsList", list);
        //3、利用请求转发跳转到商品查询页面，并将request域中的数据带入页面中展示
        return "forward:/admin/showGoods.jsp";
    }

    /**
     * 商品添加并将商品图片上传
     */
    public String addGoods(HttpServletRequest request, HttpServletResponse response) {
        //1、创建文件解析工厂对象
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //2、从工厂中获取解析器对象
        ServletFileUpload parser = new ServletFileUpload(factory);
        //3、解决文件名乱码问题
        parser.setHeaderEncoding("utf-8");
        //4、判断上传的表单的类型，如果表单中带enctype="multipart/from-data"说明有上传的文件
        //如果没有上传的商品的图片文件，添加失败，跳转管理员主页
        if (!ServletFileUpload.isMultipartContent(request)) {
            return "redirect:/admin/admin.jsp";
        }
        //5、调用解析器上传数据
        try {
            List<FileItem> fileItems = parser.parseRequest(request);
            //6、获取保存文件的本地服务器目录路径
            //上传到项目编译后的路径的位置：例如： D:\ideaWorkspace\java2203\out\artifacts\myshop_war_exploded\files
            String uploadPath = request.getServletContext().getRealPath("/files");
            System.out.println("===图片上传后的路径===" + uploadPath);
            //7、判断服务器保存文件的目录是否存在，如果目录不存在自动创建文件夹
            File fileDir = new File(uploadPath);
            if (fileDir.exists()) {
                fileDir.mkdirs();
            }
            //8、创建Goods商品对象
            Goods goods = new Goods();
            //9、遍历表单中的每一个元素
            for (FileItem fileItem : fileItems) {

                //10、判断如果是普通表单，将表单存入goods商品对象中
                if (fileItem.getString() == null || "".equals(fileItem.getString())) {
                    continue;
                }
                //如果是商品分类放入goods对象中
                if ("typeid".equals(fileItem.getFieldName())) {
                    goods.setTid(Integer.parseInt(fileItem.getString()));
                }
                //商品名称
                if ("name".equals(fileItem.getFieldName())) {
                    goods.setName(new String(fileItem.getString().getBytes("ISO-8859-1"), "utf-8"));
                }
                //商品创建的时间
                if ("pubdate".equals(fileItem.getFieldName())) {
                    String dateStr = fileItem.getString();
                    //日期格式
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    goods.setPubdate(sdf.parse(dateStr));
                }
                //商品价格
                if ("price".equals(fileItem.getFieldName())) {
                    goods.setPrice(Integer.parseInt(fileItem.getString()));
                }
                //商品评分
                if ("star".equals(fileItem.getFieldName())) {
                    goods.setStar(Integer.parseInt(fileItem.getString()));
                }
                //商品简介
                if ("intro".equals(fileItem.getFieldName())) {
                    goods.setIntro(new String(fileItem.getString().getBytes("ISO-8859-1"), "utf-8"));
                } else {
                    //11、判断如果是文件，则获取上传的路径和文件名
                    //c://xxx//xxx//xxx.jpg
                    String filePath = fileItem.getName();
                    //12、如果未上传文件，继续处理下一个字段
                    if (filePath == null || "".equals(filePath)) {
                        continue;
                    }
                    //13、获取上传文件的文件名
                    String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
                    //14、做io操作，保存文件到服务器硬盘目录的指定位置，获取输入流读取文件
                    InputStream inputStream = fileItem.getInputStream();
                    //15、将文件保存在服务器硬盘目录+文件名，组成具体的保存路径
                    FileOutputStream out = new FileOutputStream(uploadPath + "\\" + fileName);
                    System.out.println("===文件保存后的完整路径===" + uploadPath + "\\" + fileName);
                    //创建缓冲区
                    byte[] buffer = new byte[1024];
                    //读取长度
                    int len = 0;
                    //如果读取的长度大于0.说明读取到了内容，可以输出
                    while ((len = inputStream.read(buffer)) > 0) {
                        out.write(buffer, 0, len);
                    }
                    out.close();
                    inputStream.close();

                    //16、保存好设置Goods商品对象中图片保存后的路径以及文件名信息
                    goods.setPicture("http://localhost:8080/files/" + fileName);
                }

            }
            //17、调用service，保存goods商品对象到数据库的商品表中
            GoodsService goodsService = new GoodsServiceImpl();
            goodsService.addGoods(goods);


        } catch (Exception e) {
            e.printStackTrace();
        }
        //18、跳转到商品查看页面
        return "redirect:/admin/showGoods.jsp";
        }




    }

